package com.wyl.mq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.wyl.util.QueueArguments;


/**
 * 用原生mq实现延迟队列：ttl超时后转发到死信队列，那么死信队列中的消息就是延迟后的消息
 * @author 吴宇亮 on 2023/6/9 13:22
 */
@Configuration
public class TtlQueueConfig {

    /**
     * 延迟队列：输入
     */
    public static final String ttlQueueInput = "ttlQueueInput";

    /**
     * 死信交换机
     */
    public static final String ttlQueueExchange = "ttlQueueExchange";

    /**
     * 延迟队列：输出，延迟后的消息从这里拿
     * 其实就是死信队列
     */
    public static final String ttlQueueOutput = "ttlQueueOutput";

    /**
     * 定义死信交换机
     */
    @Bean
    public TopicExchange ttlQueueExchange() {
        return new TopicExchange(ttlQueueExchange);
    }

    /**
     * 定义普通队列，并且绑定死信交换机
     */
    @Bean
    public Queue ttlQueueInput(){
        return QueueBuilder.nonDurable(ttlQueueInput)
                .withArgument(QueueArguments.XDeadLetterExchange.getArgumentName(), ttlQueueExchange)
                .build();
    }

    /**
     * 定义死信队列
     */
    @Bean
    public Queue ttlQueueOutput(){
        return QueueBuilder.nonDurable(ttlQueueOutput).build();
    }

    /**
     * 声明绑定关系：死信队列 和 死信交换机
     */
    @Bean
    public Binding ttlQueueOutputBinding(@Qualifier("ttlQueueOutput") Queue ttlQueueOutput,
                                         @Qualifier("ttlQueueExchange") Exchange ttlQueueExchange){
        return BindingBuilder.bind(ttlQueueOutput).to(ttlQueueExchange).with("*").noargs();
    }



}





















